package tech.aistar.corejava.day03.method;

/**
 * @author success
 * @version 1.0
 * @description:本类用来演示:
 *    当点击Run运行的时候
 *    1. JVM加载MethodTest01类进内存.
 *    2. 由于main是使用static修饰的,使用static修饰的就是属于类
 *    3. static修饰的就会立即在内存中被分配空间以及初始化好.
 *    4. JVM就会去寻找方法名称为main的方法,进入执行里面的业务逻辑
 *    5. 当执行到main里面的 MethodTest01 t = new MethodTest01();
 *    6. 就会在内存中为所有的非静态成员[包括非静态方法]分配空间以及初始化
 *    7. 通过对象去调用非静态的方法[非静态的方法是对象拥有的]
 *
 * @date 2019/7/17 0017
 */
public class MethodTest01 {
    /**
     * main方法仍然是程序的唯一的入口.
     *
     * @param args
     */
    public static void main(String[] args) {
        //方法体中不能够再去定义方法
        //但是可以调用方法!!!

        //调用非静态方法的时候,是需要通过对象来调用的
        //why? - 非静态的成员是对象拥有的?

        //创建对象
        //类名 对象名 = new 类名();
        //当程序执行到此句的时候,就会在内存中为所有的非静态成员[包括非静态方法]
        //分配空间以及初始化

        //调用谁里面的方法就去创建谁的对象!
        MethodTest01 t = new MethodTest01();//t就是对象
        //通过对象.方法()直接调用
        t.test01();

        //调用静态方法
        //类名.方法名()
        MethodTest01.test02();

        //不推荐通过对象去调用静态方法
        //t.test02();

        //MethodTest01.test01();

    }

    /**
     * 文档注释
     * 自定义的方法.不是程序的入口方法
     * 需要在main方法中去调用.
     */
    public void test01() {
        //业务逻辑
        System.out.println("test01...");
    }

    /**
     * 公共的静态的无返回类型,无参的方法
     * static修饰的属于静态成员 - 类拥有的
     * 谁拥有就是谁去调用.
     */
    public static void test02() {
        System.out.println("test02...");
    }

    /**
     * 静态方法
     */
    public static void test03() {
        //直接调用非静态方法
        //创建对象
        MethodTest01 t = new MethodTest01();
        t.test01();

        //直接调用静态方法
        //MethodTest01.test02();

        //简化
        test02();

        //System.out.println("test03...");
    }

    /**
     * 非静态方法
     */
    public void test04() {
        //直接调用非静态方法

        //this关键字 - 代表的是当前对象 - 当前在调用test04方法的对象,可以省略不写

        //所谓的直接调用的意思:就是对象或者类直接省略不写.

        //this.test01();
        //直接调用静态方法
        test02();
    }
}

